package com.av.client.util.sesion;

import java.net.MalformedURLException;
import java.rmi.AccessException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.util.Hashtable;
import java.util.Map;

import org.apache.log4j.Logger;

import com.av.exceptions.AvException;
import com.av.rmi.interfaces.ServerRemote;

/**
 * Clase creada para el manejo de stubs remotos
 * 
 * @author Victor J Morales R
 * 
 */
public class RemoteStubCache {

	private static Logger log = Logger.getLogger(RemoteStubCache.class);
	private static Map<String, ServerRemote> cache = new Hashtable<String, ServerRemote>();

	public static ServerRemote getStubToRemoteObject(String host)
			throws AvException {
		ServerRemote toReturn = cache.get(host);
		if (toReturn == null) {
			try {
				toReturn = (ServerRemote) Naming
						.lookup(ServerRemote.OBJECT_STUB_REGISTRY_NAME);
			} catch (AccessException e) {
				log.error("No se puede acceder al servicio solicitado");
				throw new AvException(
						"No se puede acceder al servicio solicitado", e);
			} catch (RemoteException e) {
				log.error("Problema de comunicacion con el host : " + host);
				throw new AvException("Problema de comunicacion con el host : "
						+ host, e);
			} catch (NotBoundException e) {
				log.error("Servicio no registrado en el servidor : "
						+ ServerRemote.OBJECT_STUB_REGISTRY_NAME);
				throw new AvException(
						"Servicio no registrado en el servidor : "
								+ ServerRemote.OBJECT_STUB_REGISTRY_NAME, e);
			} catch (MalformedURLException e) {
				log.error("URL invalida : " + host);
				throw new AvException("URL invalida : " + host, e);
			}
			if (toReturn != null) {
				cache.put(host, toReturn);
			}
		}

		return toReturn;
	}// getStubToRemoteObject

	public static void removeStubFromCache(String host) {
		log.info("Eliminando del cache : " + host);
		cache.remove(host);
	}// removeStubFromCache
}// RemoteStubCache